package com.wy.copy_on_write_demo;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.TimeUnit;

public class Main {
    static CopyOnWriteArrayList<String> cow = new CopyOnWriteArrayList<>();

    static class MyThread extends Thread {
        @Override
        public void run() {
            System.out.println(cow.size()); // 只读操作
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(cow.size()); // 只读操作
        }
    }

    public static void main(String[] args) throws InterruptedException {
        cow.add("1");
        cow.add("2");
        cow.add("3");

        MyThread t = new MyThread();
        t.start();

        System.out.println(cow.size()); // 只读操作
        TimeUnit.SECONDS.sleep(1);
        cow.add("4");   // 由于进行了写的操作，所以，会为主线程复制一份元素
                        // 导致不是同一份数据了
                        //即未休眠前主线程子线程打印的都是3，而休眠1s后,主线程由于执行写操作，会针对主线程复制一份顺序表
                        //这是主线程和子线程看到的就不是一个数据了，而是两份数据，主线程添加了元素size（）为4，子线程仍旧读取到的size为3
        System.out.println(cow.size()); // 只读操作
    }
}
